Denne posten beskriver hvordan man kan beregne robuste standardfeil i R.
Det er ofte nyttig å bruke robuste standardfeil når vi kjører regresjon. Jeg går ikke innpå hvorfor her, men viser raskt hvordan vi gjør dette i R og hvordan vi får det inn i en Stargazer-tabell.
Første skritt er som vanlig å laste inn nyttige pakker. Jeg har forsøkt å bruke kun tidyverse
for tilrettelegging av data, lmtest
for standardfeil og stargazer
for å lage tabellen. Jeg bruker også konsekvent pipe: %>%
fordi det er lettere å lese.
# For databehendling
library("tidyverse")
# Utregningsprogrammer som brukes av lmtest under
library("sandwich")
# Kode for å teste
library("lmtest")
#Tabell:
library("stargazer")
Her lager jeg et eksempeldatasett der avhengig og uavhengig variabel har en ganske sterk sammenheng, men der denne sammenhengen er avhengig av hvilket land man er i. Altså må vi lage cluster på land.
# Vi finner på et datasett med tilfeldige tall mellom 1 og 10:
datasett <-cbind(independent=sample(c(1:10,NA),1000,replace=T),
Country=sample(c("Norway","Sweden","Denmark","Finland"),1000,replace=T)
) %>% as_tibble()
#Vi gjør om til numerisk
datasett$independent <- datasett$independent %>% as.numeric()
#Lager en avhengig variabel
datasett$dependent <- datasett$independent*(sample(c(1:100),1000,replace=T)/100)
#Lager variasjon i den avhengige variabelen som er ulik mellom ulike land
datasett$dependent[datasett$Country=="Norway"] <- datasett$independent[datasett$Country=="Norway"]*(sample(c(1:20),1000,replace=T)/100)+1
datasett$dependent[datasett$Country=="Sweden"] <- datasett$independent[datasett$Country=="Sweden"]*(sample(c(50:100),1000,replace=T)/100)-1
datasett$dependent[datasett$Country=="Denmark"] <- datasett$independent[datasett$Country=="Denmark"]*(sample(c(30:60),1000,replace=T)/100)+2
#Prøvde å lage litt systematisk variasjon i dataene, men vet ikke hvor godt dette funka:
datasett$dependent[rep(c(TRUE,FALSE,FALSE,FALSE),250)] <- datasett$dependent[rep(c(TRUE,FALSE,FALSE,FALSE),250)]*.9
datasett$independent[rep(c(TRUE,FALSE,FALSE,FALSE),250)] <- datasett$independent[rep(c(TRUE,FALSE,FALSE,FALSE),250)]-1
modell1<-lm(dependent~independent,data=datasett)
Her bruker vi altså modellen vi fikk over. Så spesifiserer vi hvilken type standardfeil vi vil ha. Se denne siden for mer informasjon om ulike alternativer. NB: Stata sin standardversjon av robust
er ikke en god måte å beregne standardfeil på. Så ikke bruk type = "HC1"
med mindre dere skal replikere noe som er gjort i Stata.
modell1_robust <- coeftest(modell1, vcov = vcovHC)
Vi kan også spesifisere at det er clustre i datasettet. For eksempel på land:
modell1_cluster <- coeftest(modell1, vcov = vcovCL, cluster = ~Country)
I stargazer kan du spesifisere standardfeilene med valget se =
. Vi må legge inn en vektor (tallrekke) med standardfeil for hver modell. Her setter jeg NULL
som den første fordi jeg ikke ønsker å endre standardfeilene i den første modellen. For de to andre spesifiserer jeg hvilke standardfeil jeg vil ha. Det gjør jeg ved å hente ut Std. Error
for hver av de robuste modellene. Da får jeg ut bare standardfeilene fra hver modell.
Vi ser at det har størst effekt å clustre på land her og ikke så store konsekvenser å kjøre robuste standardfeil. Dette forårsakes selvfølgelig av at datasettet jeg lagde høyere opp hadde en sterk sammenheng mellom land og forholdet mellom avhengig og uavhengig variabel.
stargazer(list("lm"=modell1,"robust"=modell1,modell1),
type = "html",
column.labels = c("lm","robust","cluster"),
dep.var.caption = "Model",
#Her kommer standardfeilene
se = list(NULL,
modell1_robust[,"Std. Error"],
modell1_cluster[,"Std. Error"]
))
Model | |||
dependent | |||
lm | robust | cluster | |
(1) | (2) | (3) | |
independent | 0.436*** | 0.436*** | 0.436*** |
(0.018) | (0.020) | (0.137) | |
Constant | 0.607*** | 0.607*** | 0.607 |
(0.110) | (0.085) | (0.602) | |
Observations | 917 | 917 | 917 |
R2 | 0.385 | 0.385 | 0.385 |
Adjusted R2 | 0.385 | 0.385 | 0.385 |
Residual Std. Error (df = 915) | 1.642 | 1.642 | 1.642 |
F Statistic (df = 1; 915) | 573.685*** | 573.685*** | 573.685*** |
Note: | p<0.1; p<0.05; p<0.01 |
For attribution, please cite this work as
Solheim (2022, Sept. 19). Solheim: Robuste standardfeil. Retrieved from https://www.oyvindsolheim.com/code/Robuste standardfeil/
BibTeX citation
@misc{solheim2022robuste, author = {Solheim, Øyvind Bugge}, title = {Solheim: Robuste standardfeil}, url = {https://www.oyvindsolheim.com/code/Robuste standardfeil/}, year = {2022} }